package server

import (
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	swaggerfiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	"server_go/docs"
	"server_go/internal/handler"
	"server_go/internal/middleware"
	"server_go/pkg/jwt"
	"server_go/pkg/log"
	"server_go/pkg/server/http"
)

func NewHTTPServer(
	logger *log.Logger,
	conf *viper.Viper,
	jwt *jwt.JWT,
	userHandler handler.UserHandler,
	tagHandler handler.TagHandler,
	articleHandler handler.ArticleHandler,
	fileHandler handler.FileHandler,
) *http.Server {
	if conf.GetString("env") == "prod" {
		gin.SetMode(gin.ReleaseMode)
	}
	s := http.NewServer(
		gin.Default(),
		logger,
		http.WithServerHost(conf.GetString("http.host")),
		http.WithServerPort(conf.GetInt("http.port")),
	)

	// swagger doc
	docs.SwaggerInfo.BasePath = ""
	s.GET("/swagger/*any", ginSwagger.WrapHandler(
		swaggerfiles.Handler,
		//ginSwagger.URL(fmt.Sprintf("http://localhost:%d/swagger/doc.json", conf.GetInt("app.http.port"))),
		ginSwagger.DefaultModelsExpandDepth(-1),
		ginSwagger.PersistAuthorization(true),
	))

	s.Use(middleware.CORSMiddleware())

	// 公共方法
	s.POST("/register", userHandler.Register)                       // 注册
	s.POST("/login", userHandler.Login)                             // 登录
	s.GET("/article/:articleId", articleHandler.GetArticleProfile)  // 查看文章详情
	s.GET("/tag/:tagId/articles", articleHandler.GetArticleByTagId) // 查询标签下的文章 区分全部文章和标签下的文章
	s.GET("/articles", articleHandler.GetAllArticle)                // 获取所有文章
	s.GET("/tagList", tagHandler.GetAllTagList)                     // 获取所有标签

	// 增加一个搜索文章的接口
	s.GET("/articles/search", articleHandler.GetArticleByTitle) // 搜索文章

	common := s.Group("/common")
	{
		common.POST("/file/upload", fileHandler.UploadFile)  // 上传文件
		common.DELETE("/file", fileHandler.DeleteFile)       // 删除文件
		common.GET("/file/:fileId", fileHandler.GetFileInfo) // 根据编号获取文件（用于头像）
	}

	// 管理员权限 待增加中间件鉴权
	//admin := s.Group("/admin", middleware.StrictAuth(jwt, logger), middleware.RequireRole(v1.AdminTypeCode))
	admin := s.Group("/admin")
	{
		// 文章管理
		admin.DELETE("/article/:articleId", articleHandler.DeleteArticle) // 删除文章
		admin.PUT("/article", articleHandler.UpdateArticle)               // 更新文章
		admin.GET("/articles", articleHandler.GetAllArticleList)          // 获取所有文章

		// 标签管理
		admin.POST("/tag", tagHandler.AddTag)             // 新增标签
		admin.DELETE("/tag/:tagId", tagHandler.DeleteTag) // 删除标签
		admin.PUT("/tag/:tagId", tagHandler.UpdateTag)    // 更新标签
		admin.GET("/tags", tagHandler.GetAllTag)          // 获取所有标签
		admin.GET("tag/:tagId", tagHandler.GetTagById)    // 获取标签详情

		// 用户管理
		admin.POST("/user", userHandler.AddUser)              // 新增用户
		admin.DELETE("/user/:userId", userHandler.DeleteUser) // 删除用户
		admin.PUT("/user", userHandler.UpdateUser)            // 更新用户
		admin.GET("/users", userHandler.GetAllUser)           // 获取所有用户

	}

	s.Static("/static", "./static")

	// 用户权限 待增加中间件鉴权
	//user := s.Group("/user", middleware.StrictAuth(jwt, logger), middleware.RequireRole(v1.UserTypeCode))
	user := s.Group("/user")
	{
		user.POST("/article", articleHandler.AddArticle)                 // 添加文章
		user.PUT("/article", articleHandler.UpdateArticle)               // 更新文章
		user.DELETE("/article/:articleId", articleHandler.DeleteArticle) // 删除文章
		user.GET("/tag/:tagId", tagHandler.GetTagById)                   // 查看单个标签
		user.GET("/:userId/articles", articleHandler.GetArticleByUserId) // 查询用户文章
		user.GET("/profile/:account", userHandler.GetUserProfile)        // 个人信息
		user.PUT("/profile", userHandler.UpdateUserProfile)              // 用户修改个人信息
		user.PUT("/profile/avatar", fileHandler.UploadAvatar)            // 用户修改头像
	}

	return s
}
